package com.adisi.bd;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.adisi.objetos.Auto;
import com.adisi.objetos.Chofer;
import com.adisi.objetos.Jornada;
import com.adisi.objetos.JornadaEstado;
import com.adisi.objetos.Turno;

public class JornadaDatos {

	public int grabar(Jornada jornada) {
				
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		int ok = 0;
		
		try {
			
			con = coneccion.conectar();
			
			if(jornada.getId()!=0){
				
				sp = con.prepareCall("{call sp_Jornada_Update(?,?,?,?,?,?,?,?)}");
				
				sp.setInt("id_jornada", jornada.getId());
				sp.setInt("id_auto", jornada.getAuto().getIdAuto());
				sp.setInt("id_chofer", jornada.getChofer().getIdChofer());
				sp.setDate("fecha_inicio", new java.sql.Date(jornada.getFechaInicial().getTime()));
				sp.setDate("fecha_cierre", new java.sql.Date(jornada.getFechaFinal().getTime()));
				sp.setNull("ultimo_viaje", java.sql.Types.DATE);
				sp.setString("estado", jornada.getEstado().toString());
				sp.setString("turno",  jornada.getTurno().toString());
				
				sp.execute();
			
				ok = jornada.getId();
			} else {
				
				sp = con.prepareCall("{? = call sp_Jornada_Insert(?,?,?,?,?,?)}");
				
				sp.registerOutParameter(1, java.sql.Types.INTEGER);
				
				sp.setInt("id_auto", jornada.getAuto().getIdAuto() );
				sp.setInt("id_chofer", jornada.getChofer().getIdChofer());
				sp.setDate("fecha_inicio", new java.sql.Date( jornada.getFechaInicial().getTime()));
				sp.setDate("fecha_cierre", new java.sql.Date( jornada.getFechaFinal()!=null?jornada.getFechaFinal().getTime():0));
				sp.setString("estado", jornada.getEstado().toString());
				sp.setString("turno", jornada.getTurno().toString());
	
				
				sp.execute();

				
				ok = sp.getInt(1);
				
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		
		return ok;
		
	}

	public List<Jornada> conseguirTodasLasJornadas() throws Exception {
		List<Jornada> jornadas;
		
		try {
			jornadas = conseguirTodasLasJornadas(0, null, null);
		}
		catch (Exception e) {
			throw e;
		}
		
		return jornadas;

	}

	public List<Jornada> conseguirTodasLasJornadas(JornadaEstado estado) throws Exception {
		
		List<Jornada> jornadas;
		
		try {
			jornadas = conseguirTodasLasJornadas(0, estado, null);
		}
		catch (Exception e) {
			throw e;
		}
		
		return jornadas;
		
	}

	public List<Jornada> conseguirTodasLasJornadas(Turno turno) throws Exception {
		
		List<Jornada> jornadas;
		
		try {
			jornadas = conseguirTodasLasJornadas(0, null, turno);
		}
		catch (Exception e) {
			throw e;
		}
		
		return jornadas;
		
	}

	
	public List<Jornada> conseguirTodasLasJornadas(int idJornada, JornadaEstado estado, Turno turno) throws Exception {
		List<Jornada> jornadas = new ArrayList<Jornada>();
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		ChoferDatos cd = new ChoferDatos();
		AutoDatos ad = new AutoDatos();
		
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Jornada_Select(?,?,?)}");
			
			if(idJornada==0)
				sp.setNull("id_jornada", java.sql.Types.INTEGER);
			else
				sp.setInt("id_jornada", idJornada);
			
			if(turno==null)
				sp.setNull("turno", java.sql.Types.VARCHAR);
			else
				sp.setString("turno", turno.toString());
			
			if(estado==null)
				sp.setNull("estado", java.sql.Types.VARCHAR);
			else
				sp.setString("estado", estado.toString());
			
			sp.execute();
			
			rs = sp.getResultSet();
						
			while (rs.next()) {
				Chofer chofer = cd.conseguirUnChofer(rs.getInt("id_chofer"));
				Auto auto = ad.conseguirUnAuto(rs.getInt("id_auto"));
				
				Jornada jornada = new Jornada(
							rs.getInt("id_jornada"),
							chofer,
							auto,
							rs.getDate("fecha_inicio"),
							rs.getDate("fecha_cierre"),
							JornadaEstado.valueOf(rs.getString("estado")),
							Turno.valueOf(rs.getString("turno"))
						);

				jornadas.add(jornada);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			throw e;
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		
		return jornadas;

	}

	
	public Jornada conseguirUnaJornada(int idJornada) {
		Jornada jornada = null;
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		ChoferDatos cd = new ChoferDatos();
		AutoDatos ad = new AutoDatos();
		
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Jornada_Select(?,?,?)}");
			
			sp.setNull("estado", java.sql.Types.VARCHAR);

			sp.setNull("turno", java.sql.Types.VARCHAR);			
			
			sp.setInt("id_jornada", idJornada);
			
			sp.execute();
			
			rs = sp.getResultSet();
						
			while (rs.next()) {
				Chofer chofer = cd.conseguirUnChofer(rs.getInt("id_chofer"));
				Auto auto = ad.conseguirUnAuto(rs.getInt("id_auto"));
				
				jornada = new Jornada(
							rs.getInt("id_jornada"),
							chofer,
							auto,
							rs.getDate("fecha_inicio"),
							rs.getDate("fecha_cierre"),
							JornadaEstado.valueOf(rs.getString("estado")),
							Turno.valueOf(rs.getString("turno"))
						);
				
				break;
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		
		return jornada;
	}
	
	

}
